import { Injectable } from '@nestjs/common';
import { Cron, CronExpression, SchedulerRegistry } from '@nestjs/schedule';
import { CronJob } from 'cron';

@Injectable()
export class TimerService {
  constructor(private schedulerRegistry: SchedulerRegistry) {}

  /**
   * 添加自定义定时器
   * @param name 定时器名称
   * @param cronTime 定时器时间 Cron表达式
   * @param callback 定时器回调函数
   */
  addCronJob(name: string, cronTime: string, callback: () => void) {
    const job = new CronJob(cronTime, callback);
    this.schedulerRegistry.addCronJob(name, job);
    job.start();
    return `${name} 定时器已启动`;
  }

  /**
   * 停止指定的定时任务
   * @param name 定时器名称
   */
  stopCronJob(name: string) {
    try {
      const job = this.schedulerRegistry.getCronJob(name);
      job.stop();
      return `${name} 定时器已停止`;
    } catch (error) {
      return `${name} 定时器不存在, 或者已停止`;
    }
  }

  /**
   * 添加延时任务
   * @param name 定时器名称
   * @param callback 定时器回调函数
   * @param delay 延时时间
   */
  addTimeout(name: string, callback: () => void, delay: number) {
    const timeout = setTimeout(callback, delay);
    this.schedulerRegistry.addTimeout(name, timeout);
    return `${name} 延时任务已启动`;
  }

  /**
   * 停止延时任务
   * @param name 定时器名称
   */
  stopTimeout(name: string) {
    try { 
      const timeout = this.schedulerRegistry.getTimeout(name);
      clearTimeout(timeout);
      return `${name} 延时任务已停止`;
    } catch (error) {
      return `${name} 延时任务不存在, 或者已停止`;
    }
  }

  /**
   * 添加间隔任务
   * @param name 定时器名称
   * @param callback 定时器回调函数
   * @param interval 间隔时间
   */
  addInterval(name: string, callback: () => void, interval: number) {
    const intervalId = setInterval(callback, interval);
    this.schedulerRegistry.addInterval(name, intervalId);
    return `${name} 间隔任务已启动`;
  }

  /**
   * 停止指定的间隔任务
   * @param name 定时器名称
   */
  stopInterval(name: string) {
    try {
      const intervalId = this.schedulerRegistry.getInterval(name);
      clearInterval(intervalId);
      return `${name} 间隔任务已停止`;
    } catch (error) {
      return `${name} 间隔任务不存在, 或者已停止`;
    }
  }
}
